package org.convallaria.system.biz.util;

import org.convallaria.framework.common.constants.sys.DeptConstants;
import org.convallaria.system.biz.entity.SysDept;

/**
 * 系统部门工具类
 * 
 * 功能特性：
 * - 提供部门相关的业务逻辑判断方法
 * - 提供部门状态、层级等描述信息
 * - 提供部门数据验证方法
 * - 提供部门信息格式化方法
 * - 提供部门树结构操作方法
 * 
 * 设计原则：
 * - 纯静态方法，无状态
 * - 业务逻辑与实体类分离
 * - 便于单元测试
 * - 提高代码可维护性
 * 
 * @author convallaria
 * @since 1.0.0
 */
public class SysDeptUtils {

    // ==================== 状态判断方法 ====================

    /**
     * 判断部门是否正常状态
     * 
     * @param dept 部门对象
     * @return true=正常，false=停用
     */
    public static boolean isNormal(SysDept dept) {
        if (dept == null || dept.getStatus() == null) {
            return false;
        }
        return DeptConstants.DEPT_STATUS_NORMAL.equals(dept.getStatus());
    }

    /**
     * 判断部门是否停用状态
     * 
     * @param dept 部门对象
     * @return true=停用，false=正常
     */
    public static boolean isDisabled(SysDept dept) {
        if (dept == null || dept.getStatus() == null) {
            return false;
        }
        return DeptConstants.DEPT_STATUS_DISABLED.equals(dept.getStatus());
    }

    /**
     * 判断部门状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidStatus(String status) {
        return DeptConstants.isValidDeptStatus(status);
    }

    // ==================== 层级判断方法 ====================

    /**
     * 判断是否为根部门
     * 
     * @param dept 部门对象
     * @return true=根部门，false=子部门
     */
    public static boolean isRootDept(SysDept dept) {
        if (dept == null) {
            return false;
        }
        return DeptConstants.isRootDept(dept.getParentId());
    }

    /**
     * 判断是否为子部门
     * 
     * @param dept 部门对象
     * @return true=子部门，false=根部门
     */
    public static boolean isChildDept(SysDept dept) {
        return !isRootDept(dept);
    }

    /**
     * 判断部门层级深度是否有效
     * 
     * @param dept 部门对象
     * @return true=有效，false=无效
     */
    public static boolean isValidDepth(SysDept dept) {
        if (dept == null) {
            return false;
        }
        return DeptConstants.isValidDeptDepth(dept.getAncestors());
    }

    // ==================== 数据验证方法 ====================

    /**
     * 验证部门信息是否完整
     * 
     * @param dept 部门对象
     * @return true=完整，false=不完整
     */
    public static boolean isValidDept(SysDept dept) {
        if (dept == null) {
            return false;
        }
        
        // 必填字段验证
        if (!DeptConstants.isValidDeptName(dept.getDeptName())) {
            return false;
        }
        if (dept.getTenantId() == null) {
            return false;
        }
        
        // 状态验证
        if (!isValidStatus(dept.getStatus())) {
            return false;
        }
        
        // 显示顺序验证
        if (dept.getOrderNum() != null && !DeptConstants.isValidOrderNum(dept.getOrderNum())) {
            return false;
        }
        
        // 联系方式验证
        if (dept.getPhone() != null && !DeptConstants.isValidPhone(dept.getPhone())) {
            return false;
        }
        if (dept.getEmail() != null && !DeptConstants.isValidEmail(dept.getEmail())) {
            return false;
        }
        
        // 层级深度验证
        if (!isValidDepth(dept)) {
            return false;
        }
        
        return true;
    }

    /**
     * 验证部门名称格式
     * 
     * @param deptName 部门名称
     * @return true=有效，false=无效
     */
    public static boolean isValidDeptName(String deptName) {
        return DeptConstants.isValidDeptName(deptName);
    }

    /**
     * 验证部门编码格式
     * 
     * @param deptCode 部门编码
     * @return true=有效，false=无效
     */
    public static boolean isValidDeptCode(String deptCode) {
        return DeptConstants.isValidDeptCode(deptCode);
    }

    /**
     * 验证联系电话格式
     * 
     * @param phone 联系电话
     * @return true=有效，false=无效
     */
    public static boolean isValidPhone(String phone) {
        return DeptConstants.isValidPhone(phone);
    }

    /**
     * 验证邮箱格式
     * 
     * @param email 邮箱
     * @return true=有效，false=无效
     */
    public static boolean isValidEmail(String email) {
        return DeptConstants.isValidEmail(email);
    }

    // ==================== 格式化方法 ====================

    /**
     * 格式化部门显示名称
     * 
     * @param dept 部门对象
     * @return 格式化后的显示名称
     */
    public static String formatDisplayName(SysDept dept) {
        if (dept == null) {
            return "未知部门";
        }
        
        String displayName = dept.getDeptName();
        if (displayName == null || displayName.trim().isEmpty()) {
            return "未知部门";
        }
        
        return displayName;
    }

    /**
     * 格式化部门完整信息
     * 
     * @param dept 部门对象
     * @return 格式化后的完整信息
     */
    public static String formatDeptInfo(SysDept dept) {
        if (dept == null) {
            return "部门信息为空";
        }
        
        StringBuilder sb = new StringBuilder();
        sb.append("部门ID: ").append(dept.getDeptId()).append(", ");
        sb.append("部门名称: ").append(dept.getDeptName()).append(", ");
        sb.append("父部门ID: ").append(dept.getParentId()).append(", ");
        sb.append("状态: ").append(getStatusDesc(dept.getStatus())).append(", ");
        sb.append("显示顺序: ").append(dept.getOrderNum());
        
        return sb.toString();
    }

    /**
     * 格式化部门层级路径
     * 
     * @param dept 部门对象
     * @return 层级路径，如"总公司/技术部/开发组"
     */
    public static String formatDeptPath(SysDept dept) {
        if (dept == null) {
            return "";
        }
        
        if (isRootDept(dept)) {
            return dept.getDeptName();
        }
        
        // 这里需要根据ancestors字段构建完整路径
        // 实际实现中可能需要查询数据库获取父部门信息
        return dept.getDeptName();
    }

    // ==================== 描述信息方法 ====================

    /**
     * 获取部门状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getStatusDesc(String status) {
        return DeptConstants.getDeptStatusDesc(status);
    }

    /**
     * 获取部门层级深度
     * 
     * @param dept 部门对象
     * @return 层级深度
     */
    public static int getDeptDepth(SysDept dept) {
        if (dept == null) {
            return 0;
        }
        return DeptConstants.getDeptDepth(dept.getAncestors());
    }

    /**
     * 获取部门层级描述
     * 
     * @param dept 部门对象
     * @return 层级描述，如"第3级部门"
     */
    public static String getDeptDepthDesc(SysDept dept) {
        int depth = getDeptDepth(dept);
        if (depth <= 0) {
            return "未知层级";
        }
        return "第" + depth + "级部门";
    }

    // ==================== 业务逻辑方法 ====================

    /**
     * 构建祖级列表
     * 
     * @param parentDept 父部门对象
     * @param currentDeptId 当前部门ID
     * @return 祖级列表
     */
    public static String buildAncestors(SysDept parentDept, Long currentDeptId) {
        if (parentDept == null) {
            return DeptConstants.DEFAULT_ANCESTORS;
        }
        return DeptConstants.buildAncestors(parentDept.getAncestors(), parentDept.getDeptId());
    }

    /**
     * 判断部门是否可以删除
     * 
     * @param dept 部门对象
     * @return true=可以删除，false=不能删除
     */
    public static boolean canDelete(SysDept dept) {
        if (dept == null) {
            return false;
        }
        
        // 根部门不能删除
        if (isRootDept(dept)) {
            return false;
        }
        
        // 停用的部门可以删除
        return isDisabled(dept);
    }

    /**
     * 判断部门是否可以编辑
     * 
     * @param dept 部门对象
     * @return true=可以编辑，false=不能编辑
     */
    public static boolean canEdit(SysDept dept) {
        if (dept == null) {
            return false;
        }
        
        // 正常状态的部门可以编辑
        return isNormal(dept);
    }

    /**
     * 判断部门是否可以选择
     * 
     * @param dept 部门对象
     * @return true=可以选择，false=不能选择
     */
    public static boolean canSelect(SysDept dept) {
        if (dept == null) {
            return false;
        }
        
        // 正常状态的部门可以选择
        return isNormal(dept);
    }
}
